home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-122 < prev    next >
Text File  |  1995-12-31  |  69KB  |  1,812 lines

  1. C.S.M.P. Digest             Sun, 19 Nov 95       Volume 3 : Issue 122
  2.  
  3. Today's Topics:
  4.  
  5.         Asynchronous Serial Com.
  6.         Auto-Installing Software
  7.         Deferred Task Help...
  8.         GX Font menus
  9.         GetWRefCon returns NULL if app is in background?
  10.         How to add plug-in`s to an application
  11.         How to call 68K code from Power PC (Was: Apple OneScanner Libraries: how to use them in PPC Code)
  12.         Missing-character glyphs in double-byte fonts?
  13.         Shared library version control (Was: Save me from MFC!!!)
  14.         Video Paging versus CopyBits...
  15.  
  16.  
  17.  
  18. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  19. (pottier@clipper.ens.fr).
  20.  
  21. The digest is a collection of article threads from the internet
  22. newsgroups comp.sys.mac.programmer.help, csmp.tools, csmp.misc and
  23. csmp.games. It is designed for people who read news semi-regularly and
  24. want an archive of the discussions.  If you don't know what a
  25. newsgroup is, you probably don't have access to it. Ask your systems
  26. administrator(s) for details. If you don't have access to news, you
  27. may still be able to post messages to the group by using a mail server
  28. like anon.penet.fi (mail help@anon.penet.fi for more information).
  29.  
  30. Each issue of the digest contains one or more sets of articles (called
  31. threads), with each set corresponding to a 'discussion' of a particular
  32. subject.  The articles are not edited; all articles included in this digest
  33. are in their original posted form (as received by our news server at
  34. nef.ens.fr).  Article threads are not added to the digest until the last
  35. article added to the thread is at least two weeks old (this is to ensure that
  36. the thread is dead before adding it to the digest).  Article threads that
  37. consist of only one message are generally not included in the digest.
  38.  
  39. The digest is officially distributed by two means, by email and ftp.
  40.  
  41. If you want to receive the digest by mail, send email to listserv@ens.fr
  42. with no subject and one of the following commands as body:
  43.     help                                Sends you a summary of commands
  44.     subscribe csmp-digest Your Name     Adds you to the mailing list
  45.     signoff csmp-digest                 Removes you from the list
  46. Once you have subscribed, you will automatically receive each new
  47. issue as it is created.
  48.  
  49. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  50. Questions related to the ftp site should be directed to
  51. scott.silver@dartmouth.edu.
  52.  
  53. -------------------------------------------------------
  54.  
  55. >From ted@sophocles.algonet.se (Ted Parnefors)
  56. Subject: Asynchronous Serial Com.
  57. Date: 26 Oct 1995 22:30:23 +0100
  58. Organization: AlgoNet Public Access Node, Stockholm
  59.  
  60. I was hoping that i could find someone here with some knowledge of how to 
  61. read/write data over a serial port on the macintosh asynchronously. I 
  62. found pieces of code everywhere, but unfortunatly it seems like you can 
  63. do this is lots of different ways on the macintosh (either by using a 
  64. serial driver or by using device manager) but nothing that i could patch 
  65. together to one piece of code that opens the port and then sends a byte 
  66. asynchronously and then closes the port, this mainly due to the fact that 
  67. I just getting started with programming C on the macintosh. Anyhow, any 
  68. hints where to begin or a code fragment in c or some hints to where i 
  69. could look to find a solution would be greatly appreciated. I had a look 
  70. in the "serial driver" secton of inside macintosh but could only find how 
  71. to open a serial driver and send data synchronously which is not what i 
  72. want to do... 
  73.  
  74. Cheers,
  75.   Ted
  76.  
  77.  
  78. +++++++++++++++++++++++++++
  79.  
  80. >From colen@teleport.com (Colen Garoutte-Carson)
  81. Date: Fri, 27 Oct 1995 15:36:25 +0100
  82. Organization: Metrowerks Inc.
  83.  
  84. In article <46oulf$rmc@sophocles.algonet.se>, ted@sophocles.algonet.se
  85. (Ted Parnefors) wrote:
  86.  
  87. > I was hoping that i could find someone here with some knowledge of how to 
  88. > read/write data over a serial port on the macintosh asynchronously. I 
  89. > found pieces of code everywhere, but unfortunatly it seems like you can 
  90. > do this is lots of different ways on the macintosh (either by using a 
  91. > serial driver or by using device manager) but nothing that i could patch 
  92. > together to one piece of code that opens the port and then sends a byte 
  93. > asynchronously and then closes the port, this mainly due to the fact that 
  94. > I just getting started with programming C on the macintosh. Anyhow, any 
  95. > hints where to begin or a code fragment in c or some hints to where i 
  96. > could look to find a solution would be greatly appreciated. I had a look 
  97. > in the "serial driver" secton of inside macintosh but could only find how 
  98. > to open a serial driver and send data synchronously which is not what i 
  99. > want to do... 
  100.  
  101. Ted,
  102.  
  103.      Once you have opened a serial port, you can use the input and output
  104. driver reference numbers as you would file reference numbers.  You can
  105. pass them to FSRead, FSWrite, or PBRead and PBWrite.  PBRead and PBWrite
  106. can be called asynchronously.
  107.      Have you use asynchronous IO of any kind of a Macintosh?
  108.  
  109.  - Colen Garoutte-Carson, Metrowerks Inc.
  110.  
  111. +++++++++++++++++++++++++++
  112.  
  113. >From ted@sophocles.algonet.se (Ted Parnefors)
  114. Date: 30 Oct 1995 00:42:02 +0100
  115. Organization: AlgoNet Public Access Node, Stockholm
  116.  
  117. Colen Garoutte-Carson (colen@teleport.com) wrote:
  118. :
  119. :      Once you have opened a serial port, you can use the input and output
  120. : driver reference numbers as you would file reference numbers.  You can
  121. : pass them to FSRead, FSWrite, or PBRead and PBWrite.  PBRead and PBWrite
  122. : can be called asynchronously.
  123. :      Have you use asynchronous IO of any kind of a Macintosh?
  124.  
  125. Hi Colen,
  126.  
  127. Well, no i've never used any kind of asynchronous I/O on any kind of 
  128. macintosh, actually this is my first go with programming on the 
  129. macintosh. From what i understood from the Inside Machintosh 'serial 
  130. driver' part, PBRead & PBWrite was only for synchronous transfer, but 
  131. it's not then or? From what i understood one had to go through a device 
  132. manager to use a serial port for asynchronous calls, which seemed like an 
  133. even worse jungle. 
  134.  
  135. -Ted
  136.  
  137.  
  138. +++++++++++++++++++++++++++
  139.  
  140. >From oster@netcom.com (David Phillip Oster)
  141. Date: Mon, 30 Oct 1995 01:32:44 GMT
  142. Organization: IOpener
  143.  
  144. In article <4713ga$at7@sophocles.algonet.se>, ted@sophocles.algonet.se
  145. (Ted Parnefors) wrote:
  146.  
  147. > Well, no i've never used any kind of asynchronous I/O on any kind of 
  148. > macintosh, actually this is my first go with programming on the 
  149. > macintosh. From what i understood from the Inside Machintosh 'serial 
  150. > driver' part, PBRead & PBWrite was only for synchronous transfer, but 
  151. > it's not then or? From what i understood one had to go through a device 
  152. > manager to use a serial port for asynchronous calls, which seemed like an 
  153. > even worse jungle. 
  154.  
  155. The current approved way to do this is:
  156. Use CRMSearch() to present the user with a list of serial devices on this
  157. macintosh.
  158.  
  159. When the user has chosen a serial port, open it, both for input and output
  160. using OpenDriver() as in:
  161.  
  162. OpenDriver("\p.AIn, &in);
  163. OpenDriver("\p.AOut", &out);
  164.  
  165. use SerReset() to set the parameters of the port, such as 8 data bits, 1 stop
  166. bit, 9600 baud, hardware handshaking.
  167.  
  168. Use PBWriteAsync() to write a byte as
  169.  
  170. io.ioCompletion = NULL;
  171. io.ioRefNum = out;
  172. io.ioBufdAddr = &c;
  173. io.ioReqCnt = 1;
  174. PBWriteAsync(&io);
  175.  
  176. if ioCompletion is not null, then the mac thinks it is the address of a
  177. completion routine and calls it at interrupt time, when the io is actually
  178. done.
  179.  
  180. You can poll io.ioResult to see when the io completes (it will be "1" while
  181. the io is in progress.)
  182. - ------- oster@netcom.com ----------
  183. "A man hears what he wants to hear and misremembers the rest."
  184.      -- Paul Simon, ("The Boxer")
  185.  
  186. +++++++++++++++++++++++++++
  187.  
  188. >From isis@netcom.com (Mike Cohen)
  189. Date: Mon, 30 Oct 1995 18:05:42 GMT
  190. Organization: ISIS International
  191.  
  192. In article <4713ga$at7@sophocles.algonet.se>,
  193. ted@sophocles.algonet.se (Ted Parnefors) wrote:
  194.  
  195. >
  196. >Well, no i've never used any kind of asynchronous I/O on any kind of 
  197. >macintosh, actually this is my first go with programming on the 
  198. >macintosh. From what i understood from the Inside Machintosh 'serial 
  199. >driver' part, PBRead & PBWrite was only for synchronous transfer, but 
  200. >it's not then or? From what i understood one had to go through a device 
  201. >manager to use a serial port for asynchronous calls, which seemed like an 
  202. >even worse jungle. 
  203. >
  204.  
  205. No, PBRead & PBWrite can be used either synchronously or asynchronously by
  206. setting a bit in the trap word or using PBReadSync or PBReadAsync. When you
  207. call those functions asynchronously (assuming you're using them with a
  208. device that supports asnyc I/O), they will return immediately with the
  209. IOResult field in the param block set to 1. You can either poll IOResult
  210. for 0 or a negative value or simply have it call your completion proc when
  211. the operation completes. Note that the completion proc gets called at
  212. interrupt level, so you can't allocate memory or do many other things from
  213. it. The safest thing to do is have it set a flag or start another
  214. asynchronous I/O operation (although some drivers may have a problem with
  215. that).
  216.  
  217.  
  218.  
  219.  
  220. --
  221. Mike Cohen - isis@netcom.com
  222. Home page: ftp://ftp.netcom.com/pub/is/isis/home.html
  223. Sound is the same for all the world - Youssou N'dour, "Eyes Open"
  224.  
  225. +++++++++++++++++++++++++++
  226.  
  227. >From colen@teleport.com (Colen Garoutte-Carson)
  228. Date: Tue, 31 Oct 1995 13:07:12 +0100
  229. Organization: Metrowerks Inc.
  230.  
  231. In article <4713ga$at7@sophocles.algonet.se>, ted@sophocles.algonet.se
  232. (Ted Parnefors) wrote:
  233.  
  234. > Well, no i've never used any kind of asynchronous I/O on any kind of 
  235. > macintosh, actually this is my first go with programming on the 
  236. > macintosh.
  237.  
  238. Ted,
  239.  
  240.      There's a good bit of information on Asynchronous I/O in the Think
  241. Reference (page: "Async I/O"), if you have access to it.
  242.  
  243. > From what i understood from the Inside Machintosh 'serial 
  244. > driver' part, PBRead & PBWrite was only for synchronous transfer, but 
  245. > it's not then or?
  246.  
  247.      PBRead and PBWrite can be executed either synchronously or asynchronously.
  248.  
  249. >From what i understood one had to go through a device 
  250. > manager to use a serial port for asynchronous calls, which seemed like an 
  251. > even worse jungle. 
  252.  
  253.      PBRead and PBWrite, for example, are both File Manager and Device
  254. Manager routines.  Those two routines are really the extent of the Device
  255. Manager that you need to use.
  256.  
  257.  - Colen Garoutte-Carson, Metrowerks Inc.
  258.  
  259. ---------------------------
  260.  
  261. >From suicyco@tiac.net (Harold Nicely)
  262. Subject: Auto-Installing Software
  263. Date: 3 Nov 1995 20:48:42 GMT
  264. Organization: The Internet Access Company
  265.  
  266. Hi there,
  267.  
  268. I've got some files I'd like to have auto-installed by clicking on an 
  269. installer application from a disk and inserting the appropriate disks as 
  270. the installer program deems appropriate (like installing any other kind 
  271. of program).  Are there any shareware products that I can use to help me 
  272. do this?
  273.  
  274. Oh, I also need these files compressed.
  275.  
  276. Any help would be greatly appreciated.  Please respond by email if you 
  277. can as my access to newsgroups is slow and laggy and quite the pain.  :)
  278.  
  279. Thanks,
  280.  
  281. Sean Hussey
  282.  
  283. +++++++++++++++++++++++++++
  284.  
  285. >From eric.kidd@dartmouth.edu (Eric M. Kidd)
  286. Date: 5 Nov 1995 16:39:16 GMT
  287. Organization: Dartmouth College
  288.  
  289. In article <47dv7a$fc7@sundog.tiac.net>, suicyco@tiac.net (Harold Nicely) wrote:
  290.  
  291. > I've got some files I'd like to have auto-installed by clicking on an 
  292. > installer application from a disk and inserting the appropriate disks as 
  293. > the installer program deems appropriate (like installing any other kind 
  294. > of program).  Are there any shareware products that I can use to help me 
  295. > do this?
  296. > Oh, I also need these files compressed.
  297.  
  298. I don't know of any shareware installers, but there are some relatively
  299. cheap ones. All of these can be found on the Apprentice CD or in the
  300. standard archives. Here's what I discovered when looking for an installer
  301. recently:
  302.  
  303. DeveloperVISE, DeveloperVISE Lite
  304.  
  305.    Contact <mailto:mindvision@mindvision.com>. Supports reasonable
  306. compression, has a passable UI, and can install fiendishly complex
  307. packages. Metrowerks and Apple both use this for many products. The really
  308. great point in DeveloperVISE's favor is its price: DeveloperVISE Lite is
  309. free for freeware and shareware authors. (This is what I'm currently
  310. using.)
  311.  
  312. StuffIt InstallerMaker
  313.  
  314.    Contact <mailto:dev.sales@aladdinsys.com>. In my testing, StuffIt
  315. InstallerMaker produced archives about 25% smaller than DeveloperVISE
  316. Lite. The interface is *really* simple; if you can operate StuffIt, you
  317. can operate InstallerMaker. I made fewer mistakes building test installers
  318. with this than with DeveloperVISE Lite because I could see all the
  319. installation information at once. Apple has used this in the past, and it
  320. produces some of the most aesthetic installers out there, IMHO. There's a
  321. low per-year license fee for shareware and freeware use. Check it out.
  322.  
  323. SmallerInstaller
  324.  
  325.    This was written by the author of Compact Pro and is used by Ambrosia
  326. software for all their games. It doesn't support really complex
  327. installation instructions, and the build process is less integrated than
  328. that of the two above installers. However, it produces slick packages when
  329. you're done. Licensing seems to be by volume, but talk to them for
  330. details.
  331.  
  332. Apple Installer
  333.  
  334.    This is the mother of all Macintosh installers. It's big, relatively
  335. hard to use, and can do absolutely *anything*--if you're willing to figure
  336. it out. Compression has historically been poorly integrated but that seems
  337. to be changing. Costs unkown; I didn't look very far into this option.
  338.  
  339. DragInstall
  340.  
  341.    DragInstall has a entirely different installation paradigm than the
  342. others. It displays an icon for each installation package and an icon for
  343. each possible destination drive. The user selects a package and drags it
  344. to a disk. As best as I remember, it supports compression and a built-in
  345. scripting language.
  346.  
  347. If I've omitted any products, or made any mistakes in my evaluations,
  348. please feel free to correct me. Free demos of all the above
  349. products--except possibly the Apple Installer--are available.
  350.  
  351. We really need a "How To Choose a Mac Installer FAQ". =)
  352.  
  353. Cheers,
  354. Eric
  355.  
  356. ........................................................................
  357. Eric Kidd (eric.kidd@dartmouth.edu)      http://coos.dartmouth.edu/~emk/
  358. "Computers are useless.  They can only give you answers." -Pablo Picasso
  359.  
  360. ---------------------------
  361.  
  362. >From "Alfred L. Poy" <poy@ecn.purdue.edu>
  363. Subject: Deferred Task Help...
  364. Date: 2 Nov 1995 00:45:07 GMT
  365. Organization: Purdue University
  366.  
  367. I'm programming an app on the PowerMac platform in which I would like to install
  368. a deferred task to be run at interrupt time.  I've set up a UPP for the deferred
  369. task procedure, then I install the task as follows:
  370.  
  371.         procedure InstallManipulateSndTask;     
  372.         var
  373.                 myErr: OSErr;
  374.                 theTask: DeferredTask;          
  375.          begin
  376.                 with theTask do
  377.                 begin
  378.                         qType := ORD(dtQType);
  379.                         dtAddr := MyManipulateSndProcUPP;
  380.                         dtParam := gMyA5;
  381.                         dtReserved := 0;
  382.                 end;
  383.                 gTaskError := DTInstall(@theTask);
  384.          end;
  385.  
  386. When I call this procedure, it seems to install the task with no errors.  Then
  387. interrupt time comes around and then my task is supposed to execute.  Following
  388. the Inside Mac guidelines, this is what my task looks like:
  389.  
  390.         procedure ManipulateSoundDefTask;
  391.         var
  392.                 myParam: longint;       
  393.          begin
  394.                 myParam := $00000000;
  395.                 DoManipulateSound(myParam);
  396.          end;
  397.  
  398.         procedure DoManipulateSound (A5value: longint);
  399.                 begin
  400. {               gBuffDataReady := false;}
  401.                  gMetersReady := true;
  402.         end;                            
  403.  
  404. The work is split into two procedures for supposed compatibility with optimizing
  405. compilers.  So here's what happens...  When the first line of the DoManipulateSound
  406. routine is commented out, the program will run without crashing.  When I uncomment
  407. the first line, the program crashes.  I assume I am just lucky that the program runs
  408. when the first line is commented out.  BTW, any variables beginning with "g" are
  409. global variables.
  410.  
  411. So what rules am I breaking, or what bad assumptions have I made?  I know that in
  412. the 68K environment, you need to set A5 before accessing globals.  But I thought this
  413. wasn't necessay for PPC.
  414.  
  415. Thanks for your help.
  416.  
  417. Al Poy
  418. Purdue University
  419. Email: poy@ecn.purdue.edu
  420.  
  421.  
  422.  
  423.  
  424. +++++++++++++++++++++++++++
  425.  
  426. >From jumplong@aol.com (Jump Long)
  427. Date: 2 Nov 1995 23:57:53 -0500
  428. Organization: America Online, Inc. (1-800-827-6364)
  429.  
  430. Alfred L. Poy wrote:
  431.  
  432. >I'm programming an app on the PowerMac platform in which I would
  433. >like to install a deferred task to be run at interrupt time. 
  434. >I've set up a UPP for the deferred task procedure, then I
  435. >install the task as follows:
  436. >
  437. > procedure InstallManipulateSndTask; 
  438. >  var
  439. >    myErr: OSErr;
  440. >    theTask: DeferredTask;  
  441. >  begin
  442. >    with theTask do
  443. >    begin
  444. >      qType := ORD(dtQType);
  445. >      dtAddr := MyManipulateSndProcUPP;
  446. >      dtParam := gMyA5;
  447. >      dtReserved := 0;
  448. >    end;
  449. >    gTaskError := DTInstall(@theTask);
  450. >  end;
  451.  
  452. The DeferredTask record needs to be a global or a locked block of memory.
  453.  
  454. In your code, you allocated theTask as a local variable on the stack of
  455. the InstallManipulateSndTask procedure. When the code for the procedure
  456. ends, the stack space used for local variables is released and thus, your
  457. DeferredTask is released. The next time something allocates stack space
  458. for some other purpose, the space formerly used for theTask is overwritten
  459. and the that corrupts the Deferred Task queue.
  460.  
  461. You might want to read the Macintosh Technical Note that covers deferred
  462. tasks. It covers all the rules you'll need to know when using deferred
  463. tasks.
  464.  
  465. - Jim Luther
  466.  
  467. +++++++++++++++++++++++++++
  468.  
  469. >From poy@ecn.purdue.edu (Alfred L. Poy)
  470. Date: Fri, 03 Nov 1995 23:36:26 -0600
  471. Organization: Purdue University
  472.  
  473. In article <47c7gh$62f@newsbf02.news.aol.com>, jumplong@aol.com (Jump
  474. Long) wrote:
  475.  
  476. > The DeferredTask record needs to be a global or a locked block of memory.
  477. > In your code, you allocated theTask as a local variable on the stack of
  478. > the InstallManipulateSndTask procedure. When the code for the procedure
  479. > ends, the stack space used for local variables is released and thus, your
  480. > DeferredTask is released. The next time something allocates stack space
  481. > for some other purpose, the space formerly used for theTask is overwritten
  482. > and the that corrupts the Deferred Task queue.
  483. > - Jim Luther
  484.  
  485. Yup.  That was the problem (along with a few other minor bugs).
  486. Works like a charm now.  Thanks for your help.
  487.  
  488. Al Poy
  489. Purdue University       poy@ecn.purdue.edu
  490.  
  491. ---------------------------
  492.  
  493. >From "Ted J. Pederson" <sweetp@scruznet.com>
  494. Subject: GX Font menus
  495. Date: 26 Oct 1995 22:39:42 GMT
  496. Organization: Future Labs,  Inc.
  497.  
  498. What is the recommended interface to allow users to select the 
  499. font,  font size,  and font style in a GX app?  The "Basic 
  500. Layout" sample shows how to select any if the available fonts.  
  501. Adding size would be easy,  but should a good app also allow 
  502. italic, bold,  etc. from another menu,  and,  if so, is there 
  503. a way to not let the user italicize an already italic font?
  504.  
  505. Thanks,
  506. Ted Pederson
  507.  
  508.  
  509.  
  510. +++++++++++++++++++++++++++
  511.  
  512. >From opstad@apple.com (David Opstad)
  513. Date: 27 Oct 1995 09:10:12 -0700
  514. Organization: Apple Computer Inc, Cupertino, CA
  515.  
  516. In article <46p2ne$rlk@news.scruz.net>,
  517. Ted J. Pederson <sweetp@scruznet.com> wrote:
  518. >What is the recommended interface to allow users to select the 
  519. >font,  font size,  and font style in a GX app?  The "Basic 
  520. >Layout" sample shows how to select any if the available fonts.  
  521. >Adding size would be easy,  but should a good app also allow 
  522. >italic, bold,  etc. from another menu,  and,  if so, is there 
  523. >a way to not let the user italicize an already italic font?
  524.  
  525. This is a really good question. GX introduces so many new options that it's
  526. hard to come up with a user interface for selecting them that is simple,
  527. and at the same time relatively comprehensive. I guess my overall comment
  528. would be to not necessarily tie yourself to the model that QuickDraw imposed
  529. on the Mac world -- a fixed number of styles, and no real font family
  530. organization. Since you have access to mechanisms like textfaces and
  531. variations in GX, a given family might have 8 different gradations of
  532. bold alone, and you want to make sure your user has access to them.
  533.  
  534. As to not italicizing an already italic font, heck, if the user really
  535. wants to do that, why not? I've obtained some visually fascinating results
  536. by backslanting Zapf Chancery so the letters appear upright, just for fun.
  537. Just like all the playfulness with type that happened when the Mac first
  538. came out, I think we should let users be even more playful in the much
  539. larger playground that is GX. :-)
  540.  
  541. Dave Opstad
  542. GX Line Layout Weenie
  543.  
  544. +++++++++++++++++++++++++++
  545.  
  546. >From vision@cc.swarthmore.edu (Frank Durgin, Stephen Sample, and various student researchers)
  547. Date: Fri, 27 Oct 1995 13:28:07 -0400
  548. Organization: Swarthmore Visual Perception Lab
  549.  
  550. In article <46p2ne$rlk@news.scruz.net>, "Ted J. Pederson"
  551. <sweetp@scruznet.com> wrote:
  552.  
  553. > What is the recommended interface to allow users to select the 
  554. > font,  font size,  and font style in a GX app?  The "Basic 
  555. > Layout" sample shows how to select any if the available fonts.  
  556. > Adding size would be easy,  but should a good app also allow 
  557. > italic, bold,  etc. from another menu,  and,  if so, is there 
  558. > a way to not let the user italicize an already italic font?
  559.  
  560. Well, you could always make the style menu have 'slant', 'embolden',
  561. 'condense', 'extend' (or 'oblique', 'heavy', 'tight', 'loose'), etc.
  562. Slanting an italic font seems like a reasonable operation, as does
  563. emboldening (effectively, increasing the pen width of the font outline) a
  564. bold or black font. This also deals properly with fonts which don't have
  565. multiple styles in their family (if the family doesn't have an italic
  566. member, most programs slant the regular font on the supposition that
  567. oblique is sort of vaguely like italic; maybe).
  568.  
  569. If you don't want to allow oblique italic as a style, then in your switch
  570. statement handling style menu selections, you'd check whether the font
  571. family has an italic member, and toggle between the regular and italic
  572. members if so; if not, you'd toggle between oblique and regular versions
  573. of the font. If there are mixed fonts in the selection, this could be
  574. ugly.
  575.  
  576.  
  577. Ta,
  578.         -Stephen
  579.  
  580. -- 
  581. Frank Durgin, Stephen Sample, & various student researchers
  582. - --------------------------
  583. Visual Perception Laboratory
  584. Department of Psychology
  585. Swarthmore College
  586.  
  587. +++++++++++++++++++++++++++
  588.  
  589. >From KTrueman@ixmedia.com (Kenneth Trueman)
  590. Date: Mon, 30 Oct 1995 07:29:56 -0500
  591. Organization: QuickDraw GX Fan Club
  592.  
  593. In article <46p2ne$rlk@news.scruz.net>, "Ted J. Pederson"
  594. <sweetp@scruznet.com> wrote:
  595.  
  596. >What is the recommended interface to allow users to select the 
  597. >font,  font size,  and font style in a GX app?  The "Basic 
  598. >Layout" sample shows how to select any if the available fonts.  
  599. >Adding size would be easy,  but should a good app also allow 
  600. >italic, bold,  etc. from another menu,  and,  if so, is there 
  601. >a way to not let the user italicize an already italic font?
  602. >
  603. >Thanks,
  604. >Ted Pederson
  605.  
  606. We've been having this sort of discussion on the QuickDraw GX Mailing
  607. lists. There is one that is specifically geared for developers
  608. (GXDEVList). You'll find over 60 people there with expereince developing
  609. for GX. Dave Opstad is a member too ...
  610.  
  611. You can find out more by visiting the QuickDraw GX Fan Club on the web at : 
  612.  
  613. http://www.ixmedia.com/quickgx/
  614.  
  615. and if you want specific information on subscribing, check out :
  616.  
  617. http://www.ixmedia.com/quickgx/subscribe.html
  618.  
  619. Or you can just e-mail <autoshare@ixmedia.com> with the body message :
  620.  
  621. subscribe gxdevlist ted pederson
  622.  
  623.  
  624.  
  625. Kenneth
  626.  
  627. -- 
  628. ktrueman@ixmedia.com
  629. Hungry for GX info ? Check out the QuickDraw GX Fan Club pages :
  630. <http://www.ixmedia.com/quickgx/quickgx.html>
  631.  
  632. ---------------------------
  633.  
  634. >From schmeul@umich.edu (Sam Huffman)
  635. Subject: GetWRefCon returns NULL if app is in background?
  636. Date: 27 Oct 1995 20:23:01 GMT
  637. Organization: University of Michigan
  638.  
  639. I'm having a problem with GetWRefCon (or more likely with my code that
  640. used GetWRefCon :). As part of my dialog event loop I call a function
  641. "HandleDlgDefault" which takes care of some busy work (updating the dialog
  642. based on values, etc...)
  643.  
  644. So all this works happily as long as my application is in the foreground.
  645. But the second I switch to another app I get a type 1 error. Basically my
  646. procedure checked to see if there was a window open (using FrontWindow()).
  647. Then I did GetWRefCon (my app only has one kind of window all of which
  648. have the same struct stuffed into the refcon). I didn't bother to check if
  649. this was NULL because I figured it wasn't necessary; if there was a window
  650. open in my app, i could expect it to have a refcon.
  651.  
  652. So I solved the problem by checking if the return value from GetWRefCon
  653. was NULL. My question is why do I have to do this? Does GetWRefCon not
  654. return the proper value unless the application is in the foreground? Any
  655. comments would be appreciated (preferably by e-mail).
  656.  
  657. Thanks in advance!
  658.  
  659. Sam Huffman
  660. schmeul@umich.edu
  661.  
  662.  
  663. Boolean HandleDlgDefault(EventRecord *theEvent)
  664. {
  665.    short theEditText;
  666.    Point thePoint;
  667.    DialogPtr theDialog;
  668.    dialogInfo *theInfo;
  669.    
  670.    if ((theDialog = FrontWindow()) == NULL) return;
  671.    if ((theInfo = (dialogInfo *)GetWRefCon(theDialog)) == NULL) return;
  672.  
  673.    // If I just do theInfo = (dialogInfo *)GetWRefCon(theDialog)) and then
  674.    // continue through my code I crash in the two conditionals below. Why??
  675.    // Does GetWRefCon not return the refcon if my application isn't the
  676.    // current app?
  677.    // I added the above line to solve the problem. So things work well
  678.    // now but I'm still curious why I had the problem in the first place
  679.  
  680.    theEditText = CurrentEditField(theDialog);
  681.    if ((theEditText == CalcMolFormTxt) || (theEditText == CalcListEdit)) {
  682.       SetDefaultButton(theDialog, CalcEnterButton);
  683.    } else SetDefaultButton(theDialog, CalcCalcButton);
  684.    
  685.    if (GetListSelect(theInfo->percentList, &thePoint) && (thePoint.h == 1))
  686.       ShowDItem(theDialog, CalcListEdit);
  687.    else HideDItem(theDialog, CalcListEdit);
  688.    
  689.    SetCursor(&arrow);
  690.  
  691.    return(false);
  692. }
  693.  
  694. +++++++++++++++++++++++++++
  695.  
  696. >From Matt Slot <fprefect@umich.edu>
  697. Date: 29 Oct 1995 22:28:29 GMT
  698. Organization: University of Michigan
  699.  
  700. Sam Huffman, schmeul@umich.edu writes:
  701.  
  702. > So I solved the problem by checking if the return value from
  703. > GetWRefCon was NULL. My question is why do I have to do this? Does
  704. > GetWRefCon not return the proper value unless the application is in
  705. > the foreground? Any comments would be appreciated (preferably by
  706. > e-mail).
  707.  
  708. You have forgotten to set the SIZE flags for MultiFinder-aware. When
  709. you switch layers, the compatibility code in the Process Manager will
  710. create a little-bitty window way off in the 30000 coordinate range to
  711. convince your front window that it should un-hilite... much like a DA
  712. or other System Window would. You must be walking the window list, and
  713. stumbling over this.
  714.  
  715. This one gave me 4 hours of grief after my project partner rebuilt the 
  716. project... I hope I saved you some of that grief. :)
  717.  
  718. Matt
  719.  
  720. ---------------------------
  721.  
  722. >From pj@stacken.kth.se (Patrik Johansson)
  723. Subject: How to add plug-in`s to an application
  724. Date: Sun, 01 Oct 1995 17:28:19 +0100
  725. Organization: KTH
  726.  
  727. We are developing a utility program (printer utility) and now we are
  728. thinking about plug-ins. When we started to develop our program it was
  729. intended to be a rahter small program with very limited number of
  730. functions so that all functions was "hardcoded" in the application. That
  731. was in the begining...
  732.  
  733. As of know, the number of functions have risen to the point were it is no
  734. longer practical (or even possible) to keep them all in the mainprogram so
  735. we are thinking about making the program "plug-in-able".
  736.  
  737. In our specific case, the program mainly consist of two parts, one witch
  738. handles the communication with the printers (Findind, open connection,
  739. sending, receiving etc) and the other part, the functions that the user
  740. sees and uses and the parts that accualy send data to the printer.
  741.  
  742. What we want to do here is to be able to keep all the programfunctions as
  743. seperate objects/plug-ins that use the mainapplication as sort of a
  744. communicationcenter. Then each object would provide its own userinterface
  745. to the user (altough in a standard way) and, via the mainapplication,
  746. communicate with the printers. Ofcource the objects should not be runned
  747. as separate applications but rather activated when the user choose this
  748. function in a menu (or simular) in the main application. Ofcource, it
  749. would be even better if the mainapp-plugin interface would be so easy so
  750. that other ppl could write plugins for our app.
  751.  
  752. The program is developed in CodeWarrior/Powerplant.
  753.  
  754. Ok, how do we accomplish this? What we are looking for here is not 100%
  755. solution (but if you have one..:-) but rather some ideas on how to solve
  756. it, input from ppl that has tried to do this before, how other programs
  757. that use plugins are used etc. And, there is really no need to discus this
  758. from our program`s point of view but rather from a general, "how to add
  759. plug-ins".
  760.  
  761. Also, feel free to answer some questions that you feel is missing here if
  762. you find any.
  763.  
  764. Finaly, please dont respond via email since i belive this would be an
  765. interesting discussion that many ppl would like to be part in.
  766.  
  767. Sincerely,
  768. Patrik Johansson
  769.  
  770. - ------------------------------------------------------------
  771. Patrik Johansson
  772. Royal Institute of Technology, Sweden
  773. pj@stacken.kth.se
  774. - ------------------------------------------------------------
  775.  
  776.  
  777. +++++++++++++++++++++++++++
  778.  
  779. >From dunham@nw.pensee.com (David Dunham)
  780. Date: Sun, 01 Oct 1995 12:53:01 -0700
  781. Organization: Pensee Corporation
  782.  
  783. In article <pj-0110951728190001@sl52.modempool.kth.se>, pj@stacken.kth.se
  784. (Patrik Johansson) wrote:
  785.  
  786. > We are developing a utility program (printer utility) and now we are
  787. > thinking about plug-ins. 
  788.  
  789. Code resources. I wrote an article on this for MacTutor back in the dark
  790. ages (may have even been the first article on plug-ins, not that I
  791. originated the idea -- printer drivers are probably the first Mac
  792. implementation). Have a folder full of files, each containing one (or
  793. more) code resources of the specified type (such as 'PLUG'). Load the
  794. resource, lock it, dereference it into a function pointer, and execute the
  795. function.
  796.  
  797. I haven't implemented this in years, so I'm not sure how you handle
  798. PowerPC code; I suspect one way would be to also store a code fragment in
  799. the same file and execute it instead.
  800.  
  801. David Dunham   Pensee Corporation   dunham@nw.pensee.com
  802. Voice/Fax 206 783 7404              http://www.pensee.com/dunham/
  803.     "I say we should listen to the customers and give them what they want."
  804.     "What they want is better products for free." --Scott Adams
  805.  
  806. +++++++++++++++++++++++++++
  807.  
  808. >From carl.gustafson@ece.drexel.edu (Carl Gustafson)
  809. Date: 2 Oct 1995 14:24:07 GMT
  810. Organization: Imaging and Computer Vision Center, Drexel University
  811.  
  812. In article <pj-0110951728190001@sl52.modempool.kth.se>, pj@stacken.kth.se
  813. (Patrik Johansson) wrote:
  814.  
  815. > We are developing a utility program (printer utility) and now we are
  816. > thinking about plug-ins. When we started to develop our program it was
  817. > intended to be a rahter small program with very limited number of
  818. > functions so that all functions was "hardcoded" in the application. That
  819. > was in the begining...
  820. > [snip]
  821. > Ok, how do we accomplish this? What we are looking for here is not 100%
  822. > solution (but if you have one..:-) but rather some ideas on how to solve
  823. > it, input from ppl that has tried to do this before, how other programs
  824. > that use plugins are used etc. And, there is really no need to discus this
  825. > from our program`s point of view but rather from a general, "how to add
  826. > plug-ins".
  827.  
  828.  
  829. Look at the source code for NIH-Image, by Wayne Rasband at the National
  830. Institutes of Health. It provides basic support for plug-ins, and is
  831. MetroWerks/Pascal based.
  832.  
  833. You can ftp it from:
  834.  
  835.    zippy.nimh.nih.gov
  836.  
  837. -- 
  838. Carl Gustafson
  839. Imaging and Computer Vision Center
  840. Drexel University, Philadelphia, Penna
  841. - ----------------------------------------------------------
  842. I don't speak for Drexel, and Drexel doesn't listen to me...
  843.  
  844. +++++++++++++++++++++++++++
  845.  
  846. >From pj@stacken.kth.se (Patrik Johansson)
  847. Date: Wed, 04 Oct 1995 19:59:20 +0100
  848. Organization: KTH
  849.  
  850. > Have a folder full of files, each containing one (or
  851. > more) code resources of the specified type (such as 'PLUG'). Load the
  852. > resource, lock it, dereference it into a function pointer, and execute the
  853. > function.
  854.  
  855. Ok, anyone that can explain how to access coderesources more in general? 
  856. I have never tried it so i dont know how hard it is? And, the most
  857. important, how does the plugin and the mainapp communicate?
  858.  
  859. Pj
  860.  
  861. - ------------------------------------------------------------
  862. Patrik Johansson
  863. Royal Institute of Technology, Sweden
  864. pj@stacken.kth.se
  865. - ------------------------------------------------------------
  866.  
  867.  
  868. +++++++++++++++++++++++++++
  869.  
  870. >From dunham@nw.pensee.com (David Dunham)
  871. Date: Thu, 05 Oct 1995 10:08:39 -0700
  872. Organization: Pensee Corporation
  873.  
  874. In article <pj-0410951959200001@sl06.modempool.kth.se>, pj@stacken.kth.se
  875. (Patrik Johansson) wrote:
  876.  
  877. > > Have a folder full of files, each containing one (or
  878. > > more) code resources of the specified type (such as 'PLUG'). Load the
  879. > > resource, lock it, dereference it into a function pointer, and execute the
  880. > > function.
  881. > Ok, anyone that can explain how to access coderesources more in general? 
  882. > I have never tried it so i dont know how hard it is? And, the most
  883. > important, how does the plugin and the mainapp communicate?
  884.  
  885. Gee, I thought my explanation was pretty general. Or do you want more detail?
  886.  
  887.       typedef word (*PROCPTR)(...);
  888.  
  889.       handle = GetResource('PLUG', 64);      /* Get a handle to the PROC */
  890.       HLock(handle);                   /* Hold down the PROC */
  891.       error = (**(PROCPTR *)handle)(arg1, arg2, callback);
  892.       HUnlock(handle);                 /* Let it float in the heap again */
  893.  
  894. The main app communicates to the plugin by calling it. The plugin could
  895. communicate back by returning a value, or the main app could pass in a
  896. pointer to a callback routine.
  897.  
  898. David Dunham   Pensee Corporation   dunham@nw.pensee.com
  899. Voice/Fax 206 783 7404              http://www.pensee.com/dunham/
  900.     "I say we should listen to the customers and give them what they want."
  901.     "What they want is better products for free." --Scott Adams
  902.  
  903. +++++++++++++++++++++++++++
  904.  
  905. >From Ron Nicholson <rhn@sgi.com>
  906. Date: 5 Oct 1995 18:53:01 GMT
  907. Organization: Silicon Graphics, Inc.
  908.  
  909. dunham@nw.pensee.com (David Dunham) wrote:
  910. ..
  911. >Gee, I thought my explanation was pretty general. Or do you want more detail?
  912. >
  913. >      typedef word (*PROCPTR)(...);
  914. >
  915. >      handle = GetResource('PLUG', 64);      /* Get a handle to the PROC */
  916. >      HLock(handle);                   /* Hold down the PROC */
  917. >      error = (**(PROCPTR *)handle)(arg1, arg2, callback);
  918. >      HUnlock(handle);                 /* Let it float in the heap again */
  919. >
  920. >The main app communicates to the plugin by calling it. The plugin could
  921. >communicate back by returning a value, or the main app could pass in a
  922. >pointer to a callback routine.
  923.  
  924. I'd make sure these issues are also addressed:
  925.  
  926. - What plug-in modules are available at runtime?
  927. - Are they in the default directory or can the user move them?
  928. - How easy is it for the user to add/configure plug-in modules?
  929. - Are there resource conflicts among several resource files (use Get1Resource)?
  930. - Was there a file manager error?
  931. - Was there a resource manager error?
  932. - Is the code resource the right version number?
  933. - Is the code resource 68K, PPC, fat or safe-fat?
  934. - Are you calling from a 68K or PPC?
  935. - I the callback handler the correct version?
  936. - Where do errors in the callback handler get handled?
  937. - How do you handle a variable number of parameters?
  938. - etc.
  939.  
  940. Furthermore, another method of handling plug-in's is to construct them as
  941. background applications; launch them and then communicate with them via
  942. AppleEvents.  This is usefull when you don't want a GNU public license
  943. contaminated module to possibly infect your application.
  944.  
  945. - -
  946. Ronald H. Nicholson, Jr.                rhn@engr.sgi.com, rhn@netcom.com
  947. #include <canonical.disclaimer>         // I speak only for myself, etc.
  948.  
  949.  
  950. +++++++++++++++++++++++++++
  951.  
  952. >From cho@kenner.demon.co.uk (Chris Orgill)
  953. Date: Fri, 06 Oct 1995 00:27:23 +0100
  954. Organization: (none)
  955.  
  956. In article <pj-0410951959200001@sl06.modempool.kth.se>, pj@stacken.kth.se
  957. (Patrik Johansson) wrote:
  958.  
  959. > > Have a folder full of files, each containing one (or
  960. > > more) code resources of the specified type (such as 'PLUG'). Load the
  961. > > resource, lock it, dereference it into a function pointer, and execute the
  962. > > function.
  963. > Ok, anyone that can explain how to access coderesources more in general? 
  964. > I have never tried it so i dont know how hard it is? And, the most
  965. > important, how does the plugin and the mainapp communicate?
  966. > Pj
  967. > --------------------------------------------------------------
  968. > Patrik Johansson
  969. > Royal Institute of Technology, Sweden
  970. > pj@stacken.kth.se
  971. > --------------------------------------------------------------
  972.  
  973. Why aren't you using the Component Manager ? (see
  974. NIM: More Mac Toolbox)
  975.  
  976. Best,
  977.  
  978. Chris Orgill
  979.  
  980. +++++++++++++++++++++++++++
  981.  
  982. >From nagle@netcom.com (John Nagle)
  983. Date: Mon, 9 Oct 1995 02:04:23 GMT
  984. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  985.  
  986. >In article <pj-0410951959200001@sl06.modempool.kth.se>, pj@stacken.kth.se
  987. >(Patrik Johansson) wrote:
  988. >> Ok, anyone that can explain how to access coderesources more in general? 
  989. >> I have never tried it so i dont know how hard it is? And, the most
  990. >> important, how does the plugin and the mainapp communicate?
  991.  
  992.       See 
  993.       "http://www.info.apple.com/dev/technotes/Platforms_&_Tools/pt_35.html"
  994.  
  995. There's no real Mac standard for plug-ins, short of going to OpenDoc. 
  996. Every app that supports them does it differently.  
  997.  
  998.                                         John Nagle
  999.  
  1000. +++++++++++++++++++++++++++
  1001.  
  1002. >From english@primenet.com (Lawson English)
  1003. Date: 14 Oct 1995 21:33:35 GMT
  1004. Organization: Primenet (602)395-1010
  1005.  
  1006. John Nagle (nagle@netcom.com) wrote:
  1007. : >In article <pj-0410951959200001@sl06.modempool.kth.se>, pj@stacken.kth.se
  1008. : >(Patrik Johansson) wrote:
  1009. : >> Ok, anyone that can explain how to access coderesources more in general? 
  1010. : >> I have never tried it so i dont know how hard it is? And, the most
  1011. : >> important, how does the plugin and the mainapp communicate?
  1012.  
  1013. :       See 
  1014. :       "http://www.info.apple.com/dev/technotes/Platforms_&_Tools/pt_35.html"
  1015.  
  1016. : There's no real Mac standard for plug-ins, short of going to OpenDoc. 
  1017. : Every app that supports them does it differently.  
  1018.  
  1019. But one can make an app OpenDOcable relatively easily...
  1020.  
  1021. --
  1022. - -----------------------------------------------------------------------------
  1023. Lawson English                            __  __     ____  ___       ___ ____
  1024. english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  1025.                                         /   / \  / / / / /__ /  \/ /___  /
  1026. - -----------------------------------------------------------------------------
  1027.  
  1028. +++++++++++++++++++++++++++
  1029.  
  1030. >From crawford@scipp.ucsc.edu (Mike Crawford)
  1031. Date: 14 Oct 1995 22:47:16 GMT
  1032. Organization: UC Santa Cruz - SCIPP
  1033.  
  1034. [stepping up on soapbox]
  1035.  
  1036. Yeah, Brother, I want you to Hear the Revealed Truth:
  1037.  
  1038. Use the Word Services Apple Event Suite.  It will change
  1039. your life, save your marriage, and make your crops grow
  1040. again!
  1041.  
  1042. [stepping off]
  1043.  
  1044. Depending on what you are doing, using an interapplication
  1045. method like Word Services may suit your needs.
  1046.  
  1047. Word Services allows any application to link to a speller,
  1048. grammar checker or other text service as if it is a built-in
  1049. menu item.
  1050.  
  1051. http://www.scruznet.com/~crawford/WordServices/wdsvindex.html
  1052.  
  1053. -- 
  1054. Mike Crawford                      | I use anonymous digital cash from DigiCash
  1055. crawford@scruznet.com              | Please don't use non-anon First Virtual.
  1056. crawford@maxwell.ucsc.edu          | Participate in the e-Cash trial at:
  1057. http://www.scruznet.com/~crawford/ | http://www.digicash.com
  1058.  
  1059. +++++++++++++++++++++++++++
  1060.  
  1061. >From PaulS101@mailbox.ioa.com (Paul Sexton)
  1062. Date: 17 Oct 1995 19:29:32 GMT
  1063. Organization: Vnet Internet Access, Charlotte, NC - info@char.vnet.net
  1064.  
  1065. In article <45pabf$j70@nnrp1.news.primenet.com>, english@primenet.com
  1066. (Lawson English) wrote:
  1067.  
  1068. > John Nagle (nagle@netcom.com) wrote:
  1069. > : >In article <pj-0410951959200001@sl06.modempool.kth.se>, pj@stacken.kth.se
  1070. > : >(Patrik Johansson) wrote:
  1071. > : >> Ok, anyone that can explain how to access coderesources more in general? 
  1072. > : >> I have never tried it so i dont know how hard it is? And, the most
  1073. > : >> important, how does the plugin and the mainapp communicate?
  1074. > :       See 
  1075. > :       "http://www.info.apple.com/dev/technotes/Platforms_&_Tools/pt_35.html"
  1076. > : There's no real Mac standard for plug-ins, short of going to OpenDoc. 
  1077. > : Every app that supports them does it differently.  
  1078. > But one can make an app OpenDOcable relatively easily...
  1079.  
  1080. Get hold of the Adobe Illustrator plug-in SDK. (Comes with CW.)  It's
  1081. fairly easy reading & a good intro to the most common way of doing it. 
  1082. Also, read PowerPC System software on the topic of shared libraries:  if
  1083. you're running PPC (or CFM68K, someday) there's a way to call functions
  1084. from your application without the call back mechanism (by using your app
  1085. as a code fragment that the plug-in links to).
  1086.  
  1087. +++++++++++++++++++++++++++
  1088.  
  1089. >From Samuel_Reynolds@lamg.com (Samuel Reynolds)
  1090. Date: 30 Oct 1995 19:00:00 GMT
  1091. Organization: Los Angeles Macintosh Group BBS
  1092.  
  1093. There's a cross-platform plugin framework on the Apprentice 3 CD called XPIN.
  1094. I haven't used it (just came across it while browsing the CD), but it might
  1095. do what you need.
  1096.  
  1097. - Sam
  1098.  
  1099.  
  1100. ---------------------------
  1101.  
  1102. >From oster@netcom.com (David Phillip Oster)
  1103. Subject: How to call 68K code from Power PC (Was: Apple OneScanner Libraries: how to use them in PPC Code)
  1104. Date: Fri, 20 Oct 1995 13:09:37 GMT
  1105. Organization: Netcom Online Communications Services (408-241-9760 login: guest)
  1106.  
  1107. In article <ACA7F63C966888110@194.21.60.10> cecchett@server.tdnet.it (Paolo Cecchetti) writes:
  1108. >
  1109. >Did anyone try to control Apple Scanner from PPC C code ?
  1110. >I think it's impossible because Apple Scanner Library is 68k, source code
  1111. >is not available and you CAN'T use the Driver Manager directly because in a
  1112. >particula command you have to pass two addresses on the stack. But I'm not
  1113. >sure about it. Did anyone write a new glue code for the Scanner ?
  1114.  
  1115. Passing a pointer to executable PowerPC code is done with the now familiar
  1116. idiom:
  1117.         static UserItemUPP      myUpdateUPP = NIL;
  1118.         if(NULL == myUpdateUPP){
  1119.                 myUpdateUPP = NewUserItemProc(MyUpdate);
  1120.         }
  1121. after which you use myUpdateUPP in place of MyUpdate, in every place that
  1122. you would have previously passed a reference to the callback routine
  1123. MyUpdate.
  1124.  
  1125. Going in the other direction is not so well known: i.e., you have a resource
  1126. of excutable code, that you _know_ is 68K, and you need to call it from 
  1127. code that might be compiled either as power pc or 68k.
  1128.  
  1129.  
  1130.  
  1131. Here is an example of calling a 68K routine (stored in an executable
  1132. resource) from Power PC code (actually, it will work under either.)
  1133.  
  1134. /* CallModalStyledTE.c - this calls a 68K code resource, and is usable either from
  1135.         68K or powerpc code.
  1136.         By David Phillip Oster.
  1137.         freely redistributable
  1138.         tested 10/18/95
  1139.  */
  1140. #include "ModalStyledTE.h"      // declares our entrypoint: ModalStyledTE
  1141.  
  1142.  
  1143. #ifdef __cplusplus
  1144. extern "C" {
  1145. #endif
  1146.  
  1147. /* My code resource is a handle of one of these:
  1148.  */
  1149. typedef pascal OSErr (*ModalStyledTEFunc)(Handle textH, StScrpHandle scrapH, short *justP);
  1150.  
  1151. #if GENERATINGCFM
  1152. typedef UniversalProcPtr ModalStyledTEUPP;
  1153. enum{
  1154.         uppModalStyledTEInfo = kPascalStackBased
  1155.                  | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
  1156.                  | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Handle)))
  1157.                  | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(StScrpHandle)))
  1158.                  | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(short *)))
  1159. };
  1160.  
  1161. #define NewModalStyledTE(userRoutine)           \
  1162.                 (ModalStyledTEUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), uppModalStyledTEInfo, kM68kISA)
  1163.  
  1164. #else
  1165. typedef ModalStyledTEFunc ModalStyledTEUPP;
  1166.  
  1167. #endif
  1168.  
  1169. OSErr ModalStyledTE(Handle textH, StScrpHandle scrapH, short *justP){
  1170.         ModalStyledTEFunc       *f;
  1171.         OSErr                   val;
  1172.         SignedByte              state;
  1173.  
  1174.         if(NULL != (f = (ModalStyledTEFunc *) GetResource('msTE', 128))){
  1175.                 LoadResource((Handle) f);
  1176.                 state = HGetState((Handle) f);
  1177.                 HLock((Handle) f);
  1178.                 HNoPurge((Handle) f);
  1179. #ifdef powerc
  1180.                 {ModalStyledTEUPP       msteupp = NewModalStyledTE(*f);
  1181.                 val = CallUniversalProc(msteupp, uppModalStyledTEInfo, textH, scrapH, justP);
  1182.                 DisposeRoutineDescriptor(msteupp);
  1183.                 }
  1184. #else
  1185.                 val = (**f)(textH, scrapH, justP);
  1186. #endif
  1187.                 HSetState((Handle) f, state);
  1188.         }else{
  1189.                 val = resNotFound;
  1190.         }
  1191.         return val;
  1192. }
  1193.  
  1194. #ifdef __cplusplus
  1195. };
  1196. #endif
  1197. -- 
  1198. - ------- <mail-to:oster@netcom.com> ----------
  1199. Ahh! The thorazine is wearing off and the odinazine is coming on...
  1200.  
  1201. +++++++++++++++++++++++++++
  1202.  
  1203. >From pottier@drakkar.ens.fr (Francois Pottier)
  1204. Date: 3 Nov 1995 13:37:50 GMT
  1205. Organization: Ecole Normale Superieure, Paris
  1206.  
  1207. In article <osterDGr0K1.Gqu@netcom.com>,
  1208. David Phillip Oster <oster@netcom.com> wrote:
  1209.  
  1210. >#ifdef powerc
  1211. >               {ModalStyledTEUPP       msteupp = NewModalStyledTE(*f);
  1212. >               val = CallUniversalProc(msteupp, uppModalStyledTEInfo, textH, scrapH, justP);
  1213. >               DisposeRoutineDescriptor(msteupp);
  1214. >               }
  1215. >#else
  1216.  
  1217. You don't need to do this. The 68k ISA is special; in order to retain
  1218. compatibility with previous CFM-unaware code, any raw 68k procedure
  1219. pointer is a valid UPP. Hence, you only need to write:
  1220.  
  1221.                 val = CallUniversalProc((UniversalProcPtr) *f, uppModalStyledTEInfo, textH, scrapH, justP);
  1222.  
  1223. and it'll work fine. The Mixed Mode Manager will realize that the
  1224. address pointed to by *f isn't a routine descriptor, because it
  1225. doesn't start with the magic cookie 0xAAFE. Hence, it'll assume it is
  1226. 68k code.
  1227.  
  1228. (CFM-unaware 68k code never starts with 0xAAFE because it's the trap number for
  1229. the CFM dispatch code! God, what a brilliant hack.)
  1230.  
  1231. -- 
  1232. Francois
  1233. pottier@dmi.ens.fr
  1234. http://www.eleves.ens.fr:8080/home/pottier/
  1235.  
  1236. ---------------------------
  1237.  
  1238. >From Warwick Tobin <warwick@aee.com>
  1239. Subject: Missing-character glyphs in double-byte fonts?
  1240. Date: 1 Nov 1995 06:57:01 GMT
  1241. Organization: AEE, Inc.
  1242.  
  1243. How do you determine if a given character in a font displays the
  1244. missing-character glyph (usually an empty rectangle) when rendered? 
  1245. Specifically, how do you do this with a double-byte font such as
  1246. Honmincho?  I am hoping there is a toolbox function to do this, rather
  1247. than having to render each character and compare it to a bitmap of the
  1248. missing-character glyph.  The CharacterType function comes close to
  1249. providing this information, but not quite.
  1250.  
  1251. I need to know how to do this because I am writing some code that must
  1252. render all the valid printable characters in a Japanese font to a file. 
  1253. Sprinkled throughout the thousands of Kanji chararacters, there must be
  1254. at least a hundred or so of the missing-character glyphs, which needn't
  1255. be rendered.
  1256.  
  1257. Thanks for any help,
  1258.  
  1259. Warwick Tobin
  1260. warwick@aee.com
  1261. wtobin@mailer.fsu.edu
  1262.  
  1263. +++++++++++++++++++++++++++
  1264.  
  1265. >From rac@intrigue.com (Robert Coie)
  1266. Date: Fri, 03 Nov 1995 13:53:42 -0800
  1267. Organization: Intrigue Corporation
  1268.  
  1269. In article <4775nt$j5h@news.fsu.edu>, Warwick Tobin <warwick@aee.com> wrote:
  1270.  
  1271. : How do you determine if a given character in a font displays the
  1272. : missing-character glyph (usually an empty rectangle) when rendered? 
  1273. : Specifically, how do you do this with a double-byte font such as
  1274. : Honmincho?  I am hoping there is a toolbox function to do this, rather
  1275. : than having to render each character and compare it to a bitmap of the
  1276. : missing-character glyph.  The CharacterType function comes close to
  1277. : providing this information, but not quite.
  1278.  
  1279. There is an additional subtlety which you may have noted by the fact that
  1280. you said "usually an empty rectangle".  I have seen two different
  1281. "unprintable" glyphs, which we jokingly named after two popular types of
  1282. tofu (which they sort of look like), neither of which is the traditional
  1283. single-byte empty rectangle from Roman fonts.  What I would do is open the
  1284. 'sfnt' resource and walk the 'cmap' table, trying to print everything that
  1285. has an entry.
  1286.  
  1287. : I need to know how to do this because I am writing some code that must
  1288. : render all the valid printable characters in a Japanese font to a file. 
  1289.  
  1290. You might also be interested in the fact that depending on which font you
  1291. are using (i.e. TrueType or Type 1, and which System version, whether ATM
  1292. is installed and some other obscure stuff that I've forgotten), some
  1293. characters will show up correctly on the screen but not print and some
  1294. will print correctly even though they look like tofu on the screen.  The
  1295. origin of the problem was a conflict between the way NEC and MITI decided
  1296. to encode certain characters (the only ones that I've ever seen anybody
  1297. use are the numbers enclosed in a circle).  Somewhere there was a
  1298. KanjiTalk developers note that described the problem, although I remember
  1299. having to read it about 20 times before I understood a word it was talking
  1300. about.
  1301.  
  1302. Robert Coie                              rac@intrigue.com
  1303. Implementor, Intrigue Corporation     AppleLink: INTRIGUE
  1304.  
  1305. ---------------------------
  1306.  
  1307. >From Richard Wesley <hawkfish@punchdeck.com>
  1308. Subject: Shared library version control (Was: Save me from MFC!!!)
  1309. Date: 23 Oct 1995 17:48:24 GMT
  1310. Organization: Punch Deck Consulting
  1311.  
  1312. dent@highway1.com.au (Andy Dent) wrote:
  1313. >2) Talk to a Windows developer about their problems with version control.
  1314. >If you're using shared libraries any application being installed
  1315. >subsequent to yours can invisibly blow you away.
  1316.  
  1317. I have done some Windows work and I know exactly what you mean.
  1318. It really freaks me out that few people seem to be worrying about this.
  1319. One of the Mac's biggest selling points is cheap and easy maintainence,
  1320. which this whole shared library thing just flushes down the toilet
  1321. (pardon my French...)  Anyone else feel this way?
  1322.  
  1323. - rmgw
  1324.  
  1325. http://www.punchdeck.com/hawkfish/PunchDeck.html
  1326.  
  1327. - --------------------------------------------------------------------------
  1328. Richard Wesley  hawkfish@punchdeck.com | "What was that popping sound?"
  1329. Punch Deck Consulting pnchdeck@aol.com | "A paradigm shifting without a
  1330.      Macintosh Software Development    |  clutch."  - Dilbert (Scott Adams)
  1331. - --------------------------------------------------------------------------
  1332.  
  1333.  
  1334.  
  1335. +++++++++++++++++++++++++++
  1336.  
  1337. >From awiner@oracle.com (Adam Winer)
  1338. Date: Mon, 23 Oct 1995 13:27:09 -0800
  1339. Organization: Oracle Corporation
  1340.  
  1341. In article <46gkh8$4ua@news.halcyon.com>, Richard Wesley
  1342. <hawkfish@punchdeck.com> wrote:
  1343.  
  1344. > dent@highway1.com.au (Andy Dent) wrote:
  1345. > >2) Talk to a Windows developer about their problems with version control.
  1346. > >If you're using shared libraries any application being installed
  1347. > >subsequent to yours can invisibly blow you away.
  1348. > I have done some Windows work and I know exactly what you mean.
  1349. > It really freaks me out that few people seem to be worrying about this.
  1350. > One of the Mac's biggest selling points is cheap and easy maintainence,
  1351. > which this whole shared library thing just flushes down the toilet
  1352. > (pardon my French...)  Anyone else feel this way?
  1353.  
  1354. Well, actually, the Code Fragment Manager has a very nifty
  1355. version control mechanism built in;  see PowerPC System
  1356. Software, 3-7 to 3-10.  It lets you make sure that your application
  1357. binds only to libraries with which it will definitely be compatible.
  1358. It also lets you have multiple versions of the same library installed,
  1359. and still be confident that each application will use only a version
  1360. that's compatible.  Quite nifty stuff, though it's rarely used.
  1361.  
  1362. A caveat:  setting the old definition version to a nonzero number
  1363. makes it impossible to use GetSharedLibrary() on that code fragment.
  1364.  
  1365. -- Adam Winer
  1366. awiner@us.oracle.com
  1367.  
  1368. +++++++++++++++++++++++++++
  1369.  
  1370. >From jthill@netcom.com (Jim Hill)
  1371. Date: Tue, 24 Oct 1995 03:21:07 GMT
  1372. Organization: biological <-- hey! a one-word oxymoron!
  1373.  
  1374. In article <46gkh8$4ua@news.halcyon.com>, Richard Wesley
  1375. <hawkfish@punchdeck.com> wrote:
  1376.  
  1377. >One of the Mac's biggest selling points is cheap and easy maintainence,
  1378. >which this whole shared library thing just flushes down the toilet
  1379. >(pardon my French...)  Anyone else feel this way?
  1380.  
  1381. Check the CFM docs.  Cheap and easy maintenance, as advertised:  if it
  1382. can't find the exact library your app was compiled for, it loads the
  1383. latest version that supports the same interface.  It just works, no
  1384. fiddling.  Drat.  Have to find something else to be proud of.  Dang macs
  1385. must be toys.
  1386.  
  1387. Jim
  1388. -- 
  1389. Jim Hill              Contents public domain and worth $.02 more than you paid.
  1390. jthill@netcom.com     PGPrint: 6B 85 76 D1 EF BA 2C 78  12 25 8A 5A BF F3 37 7E
  1391.  
  1392. +++++++++++++++++++++++++++
  1393.  
  1394. >From ajv@rmit.edu.au (Andrew van der Stock)
  1395. Date: Mon, 30 Oct 1995 20:07:27 +1100
  1396. Organization: RMIT Business Faculty
  1397.  
  1398. >> dent@highway1.com.au (Andy Dent) wrote:
  1399. >> >2) Talk to a Windows developer about their problems with version control.
  1400. >> >If you're using shared libraries any application being installed
  1401. > >subsequent to yours can invisibly blow you away.
  1402.  
  1403. The ASLM has very nifty version control. You can have various
  1404. versions of the library in there, if neccesary, and you can ask for
  1405. a specific version, or just ask, and it will give you the latest. 
  1406. Nice. Shame it needs to be linked via MPW.
  1407.  
  1408. Andrew
  1409.  
  1410. -- 
  1411. "Being digital, whatever it means,
  1412.   means having it your way." - Nicholas Negroponte
  1413.  
  1414. Andrew van der Stock, Systems Administrator
  1415. Computing Services Group, RMIT Business Faculty
  1416. see http://www.bf.rmit.edu.au/~ajv for contact details
  1417.  
  1418. +++++++++++++++++++++++++++
  1419.  
  1420. >From dent@highway1.com.au (Andy Dent)
  1421. Date: Tue, 31 Oct 1995 22:48:23 +0800
  1422. Organization: A.D. Software
  1423.  
  1424. In article <awiner-2310951327090001@awiner-mac2.us.oracle.com>,
  1425. awiner@oracle.com (Adam Winer) wrote:
  1426.  
  1427. >Well, actually, the Code Fragment Manager has a very nifty
  1428. >version control mechanism built in;  
  1429. ...
  1430.  It lets you make sure that your application
  1431. >binds only to libraries with which it will definitely be compatible.
  1432.  
  1433. Adam, I think you're missing my point.
  1434.  
  1435. What happens when someone installs a later version of the library
  1436. (unknowingly) with which your app is no longer compatible?
  1437.  
  1438. This is an install-time issue, not a runtime issue, about file replacement.
  1439.  
  1440. Andy Dent, Product Architect, A.D. Software, Western Australia
  1441. OOFILE - "the cross-platform OODBMS that speaks c++"
  1442. ftp://ftp.highway1.com.au/pub/adsoftware/oofile/
  1443. http://www.highway1.com.au/adsoftware/oofile.html
  1444.  
  1445. +++++++++++++++++++++++++++
  1446.  
  1447. >From bc@wetware.com (monsieur HAINEUX)
  1448. Date: Tue, 31 Oct 1995 10:41:27 -0800
  1449. Organization: GRAFIX::CODERRE
  1450.  
  1451. dent@highway1.com.au (Andy Dent) wrote:
  1452. |   What happens when someone installs a later version of the library
  1453. |   (unknowingly) with which your app is no longer compatible?
  1454. |   
  1455. |   This is an install-time issue, not a runtime issue, about file replacement.
  1456.  
  1457.  
  1458. Yup, it sure is, (says mister installer script guy).
  1459.  
  1460. The best way around it I can think of is to make everything you do be
  1461. forward-compatible, so that you still run with newer libraries.
  1462.  
  1463. The second best way, it seems to me, is to keep both libraries around by a
  1464. renaming trick, and take the hit on extra lib files bloating your system
  1465. folder.
  1466.  
  1467. bc
  1468.  
  1469. +++++++++++++++++++++++++++
  1470.  
  1471. >From Etay_Bogner@mail.stil.scitex.com (Etay Bogner)
  1472. Date: Wed, 01 Nov 1995 11:02:21 +0200
  1473. Organization: Scitex Corp.
  1474.  
  1475. In article <bc-3110951041270001@mac840.kip.apple.com>, bc@wetware.com
  1476. (monsieur HAINEUX) wrote:
  1477.  
  1478. >> dent@highway1.com.au (Andy Dent) wrote:
  1479. >> |   What happens when someone installs a later version of the library
  1480. >> |   (unknowingly) with which your app is no longer compatible?
  1481. >> |   
  1482. >> |   This is an install-time issue, not a runtime issue, about file
  1483. replacement.
  1484. >> 
  1485. >> 
  1486. >> Yup, it sure is, (says mister installer script guy).
  1487. >> 
  1488. >> The best way around it I can think of is to make everything you do be
  1489. >> forward-compatible, so that you still run with newer libraries.
  1490. >> 
  1491.  
  1492. CFM will NOT use newer shared libraries unless the interface version is
  1493. the same.
  1494.  
  1495. CFM has three version number stored in each fragment ( see the PEF panel ) :
  1496.  
  1497. Old Definition
  1498. Old Implementation
  1499. Current Version.
  1500.  
  1501. -- Etay Bogner,
  1502. -- Etay_Bogner@mail.stil.scitex.com,
  1503. -- Scitex Corp.
  1504. -- Israel.
  1505.  
  1506. +++++++++++++++++++++++++++
  1507.  
  1508. >From chris_page@powertalk.claris.com (Chris Page)
  1509. Date: Thu, 02 Nov 1995 10:21:14 -0800
  1510. Organization: Claris Corporation
  1511.  
  1512. In article <bc-3110951041270001@mac840.kip.apple.com>, bc@wetware.com
  1513. (monsieur HAINEUX) wrote:
  1514.  
  1515. > The second best way, it seems to me, is to keep both libraries around by a
  1516. > renaming trick, and take the hit on extra lib files bloating your system
  1517. > folder.
  1518.  
  1519. You could also store the old and new versions of the libary in the same file.
  1520.  
  1521. -- 
  1522. Chris Page                      | Internet junk mail, advertisements,
  1523. Claris Corporation              | and SPAMs bite...
  1524. chris_page@powertalk.claris.com |            Cut it out! :-P
  1525.  
  1526. Disclaimer: opinions are not necessarily those of my employer
  1527.  
  1528. ---------------------------
  1529.  
  1530. >From "Dr. Douglas Cheyne" <cheyne@sfu.ca>
  1531. Subject: Video Paging versus CopyBits...
  1532. Date: 25 Oct 1995 02:35:12 GMT
  1533. Organization: Simon Fraser University
  1534.  
  1535. I am currently under the impression the doing a copybits operation
  1536. from an offscreen bitmap is the usual method for buffered video on
  1537. the Mac, wheras, swapping video pages on other platforms provides a 
  1538. more instantaneous switch from one image to the next. Is there any 
  1539. way to do the latter on the Mac?  Does it require 3rd party hardware?
  1540.  
  1541. Thanks,
  1542.  
  1543. Doug Cheyne,
  1544. Simon Fraser University,
  1545. Burbaby, B.C.Canada.
  1546. cheyne@sfu.ca
  1547.  
  1548. +++++++++++++++++++++++++++
  1549.  
  1550. >From RobTerrell@vmedia.com (Rob Terrell)
  1551. Date: Wed, 25 Oct 1995 19:26:16 -0500
  1552. Organization: Fringe Multimedia, Inc.
  1553.  
  1554. In article <46k7p0$l6@morgoth.sfu.ca>, "Dr. Douglas Cheyne"
  1555. <cheyne@sfu.ca> wrote:
  1556.  
  1557. > I am currently under the impression the doing a copybits operation
  1558. > from an offscreen bitmap is the usual method for buffered video on
  1559. > the Mac, wheras, swapping video pages on other platforms provides a 
  1560. > more instantaneous switch from one image to the next. Is there any 
  1561. > way to do the latter on the Mac?  Does it require 3rd party hardware?
  1562.  
  1563. There has been no way to switch page buffers since the Mac Plus. (I think
  1564. the Plus supported it, anyway.) You might be able to make page flipping
  1565. work with 3rd party hardware, but then you're limiting your audience to
  1566. folks with that hardware.
  1567.  
  1568. If you're willing to limit your audience, you can skip CopyBits and write
  1569. directly to the screen hardware, using your own copying routines. (See
  1570. "Tricks of the Mac Game Programming Gurus" for some fast copybits
  1571. replacements.)
  1572.  
  1573. The preferred method uses CopyBits, since CopyBits can be made to work
  1574. with any number of strange and various video cards and drivers. And it's
  1575. pretty good on PowerMacs. I can get 30fps on my raycaster, which CopyBits
  1576. the buffer to the screen.
  1577.  
  1578.  
  1579. Rob
  1580.  
  1581. +++++++++++++++++++++++++++
  1582.  
  1583. >From andrewwelc@aol.com (AndrewWelc)
  1584. Date: 25 Oct 1995 19:31:00 -0400
  1585. Organization: America Online, Inc. (1-800-827-6364)
  1586.  
  1587. > Is there any way to do the latter on the Mac?  Does it require 3rd party
  1588. > hardware?
  1589.  
  1590. There is no standard way to do video paging that works on all Mac models. 
  1591. Use the CopyBits method you spoke of.
  1592.  
  1593. +--------------------------------------------------------------+
  1594. |    Andrew Welch - Thaumaturgist - Ambrosia Software, Inc.    |
  1595. +------------------------------+-------------------------------+
  1596. |    AOL-> Keyword: Ambrosia   | Internet-> www.AmbrosiaSW.com |
  1597. |    CIS-> GO word: Ambrosia   |   eWorld-> Shortcut: Ambrosia |
  1598. +------------------------------+-------------------------------+
  1599.  
  1600. +++++++++++++++++++++++++++
  1601.  
  1602. >From kfc@wimsey.com (Ken Cunningham)
  1603. Date: Thu, 26 Oct 1995 06:17:22 -0700
  1604. Organization: Online at Wimsey
  1605.  
  1606. In article <RobTerrell-2510951926160001@slip37-240-91.ibm.net>,
  1607. RobTerrell@vmedia.com (Rob Terrell) wrote:
  1608.  
  1609.  > In article <46k7p0$l6@morgoth.sfu.ca>, "Dr. Douglas Cheyne"
  1610.  > <cheyne@sfu.ca> wrote:
  1611.  > 
  1612.  > > I am currently under the impression the doing a copybits operation
  1613.  > > from an offscreen bitmap is the usual method for buffered video on
  1614.  > > the Mac, wheras, swapping video pages on other platforms provides a 
  1615.  > > more instantaneous switch from one image to the next. Is there any 
  1616.  > > way to do the latter on the Mac?  Does it require 3rd party hardware?
  1617.  > > 
  1618.  > 
  1619.  > There has been no way to switch page buffers since the Mac Plus. (I think
  1620.  > the Plus supported it, anyway.) You might be able to make page flipping
  1621.  > work with 3rd party hardware, but then you're limiting your audience to
  1622.  > folks with that hardware.
  1623.  > 
  1624.  > If you're willing to limit your audience, you can skip CopyBits and write
  1625.  > directly to the screen hardware, using your own copying routines. (See
  1626.  > "Tricks of the Mac Game Programming Gurus" for some fast copybits
  1627.  > replacements.)
  1628.  > 
  1629.  > The preferred method uses CopyBits, since CopyBits can be made to work
  1630.  > with any number of strange and various video cards and drivers. And it's
  1631.  > pretty good on PowerMacs. I can get 30fps on my raycaster, which CopyBits
  1632.  > the buffer to the screen.
  1633.  > 
  1634.  
  1635.  
  1636. I believe that other systems may not be using page flipping much longer
  1637. anyway, for the same reason that it was dumped on the mac -- hardware
  1638. video cards at high resolutions and bit depths do not contain enough
  1639. memory to allow multiple pages (too expensive), and the card's memory
  1640. architectures are generally incompatible with each other.
  1641.  
  1642. This sort of page flipping was OK under DOS and with the very early Mac
  1643. systems, but it's not compatible with modern equipment and demands.
  1644.  
  1645. +++++++++++++++++++++++++++
  1646.  
  1647. >From hubertv@cs.kun.nl (Hubert Voogd)
  1648. Date: 26 Oct 1995 22:30:28 GMT
  1649. Organization: University of Nijmegen, The Netherlands
  1650.  
  1651. In <RobTerrell-2510951926160001@slip37-240-91.ibm.net> RobTerrell@vmedia.com (Rob Terrell) writes:
  1652.  
  1653. >In article <46k7p0$l6@morgoth.sfu.ca>, "Dr. Douglas Cheyne"
  1654. ><cheyne@sfu.ca> wrote:
  1655.  
  1656. >> I am currently under the impression the doing a copybits operation
  1657. >> from an offscreen bitmap is the usual method for buffered video on
  1658. >> the Mac, wheras, swapping video pages on other platforms provides a 
  1659. >> more instantaneous switch from one image to the next. Is there any 
  1660.         ^^^^^^^^^^^^^
  1661. >> way to do the latter on the Mac?  Does it require 3rd party hardware?
  1662. >> 
  1663.  
  1664. [Arguments for using CopyBits snipped]
  1665.  
  1666. >The preferred method uses CopyBits, since CopyBits can be made to work
  1667. >with any number of strange and various video cards and drivers. And it's
  1668. >pretty good on PowerMacs. I can get 30fps on my raycaster, which CopyBits
  1669. >the buffer to the screen.           ^^^^^
  1670.  
  1671. 30 frames per second is not the problem here, I think. The goal of using
  1672. video paging is presenting an entire image at once. If you have a 90 Hz
  1673. monitor and use CopyBits to have 30 frames per second, then one frame takes
  1674. 3 vertical blanks. One Image must be presented in one vertical blank.
  1675.   In Douglas' application (as well as mine), brain signals are measured
  1676. which have a very strict timing. It is very important to have an image
  1677. presented instantaneously.
  1678.   Because you can change the position of the displayed screen in the monitors
  1679. control panel, I think it is possible to switch screen pages. Even the sound
  1680. handling resembles the way you can play sounds in a copper list, as used on
  1681. Amiga's, so I think the Mac uses a sort of copper list itself. I couldn't 
  1682. find this in the documentation though, so if anyone knows about this, let
  1683. me know too, because in the near future, I will also have to present
  1684. large colored images in one frame. I thought of using different color palettes,
  1685. but using animatepalette, causes the window to update because of an update
  1686. event. That's not what I want, I only want the color to change, not the drawing
  1687. itself.
  1688.  
  1689. Regards, Hubert
  1690.  
  1691.  
  1692. +++++++++++++++++++++++++++
  1693.  
  1694. >From scullin@fife.cs.uiuc.edu (Will Haro Scullin)
  1695. Date: 27 Oct 1995 18:11:47 GMT
  1696. Organization: University of Illinois at Urbana
  1697.  
  1698. In article <kfc-2610950617220001@pm026.vcr.wis.net> kfc@wimsey.com (Ken Cunningham) writes:
  1699. > I believe that other systems may not be using page flipping much longer
  1700. > anyway, for the same reason that it was dumped on the mac -- hardware
  1701. > video cards at high resolutions and bit depths do not contain enough
  1702. > memory to allow multiple pages (too expensive), and the card's memory
  1703. > architectures are generally incompatible with each other.
  1704. > This sort of page flipping was OK under DOS and with the very early Mac
  1705. > systems, but it's not compatible with modern equipment and demands.
  1706.  
  1707. That depends on what you mean by modern equipment and demands -- modern
  1708. graphics workstations may support as many as 4 pages at high
  1709. resolution/bit depth, for just the reason that copying 1280x1024x24 bits
  1710. to video memory at 30 frames/second just isn't reasonable.
  1711.  
  1712. Will
  1713. -- 
  1714. | Will Scullin                                  |
  1715. | University of Illinois                        |
  1716. | scullin@uiuc.edu                              |
  1717. | http://www-pablo.cs.uiuc.edu/~scullin/        |
  1718.  
  1719. +++++++++++++++++++++++++++
  1720.  
  1721. >From english@primenet.com (Lawson English)
  1722. Date: 28 Oct 1995 20:11:11 GMT
  1723. Organization: Primenet (602)395-1010
  1724.  
  1725. AndrewWelc (andrewwelc@aol.com) wrote:
  1726. : > Is there any way to do the latter on the Mac?  Does it require 3rd party
  1727. : > hardware?
  1728.  
  1729. : There is no standard way to do video paging that works on all Mac models. 
  1730. : Use the CopyBits method you spoke of.
  1731.  
  1732.  
  1733. I believe that some of the newer low-end models support an x-mode-ish 
  1734. video mode.
  1735.  
  1736. Also, there is an API for PCI cards that supports this.
  1737.  
  1738. I believe that the guy that did Tempest port (Arashi?) has some generic 
  1739. code to do page-flipping on NuBus cards, since there is an API for 
  1740. pageflipping on NuBus cards which apparently virtually no available card 
  1741. uses.
  1742.  
  1743.  
  1744. The biggest problem is not that there is no standard way (there are only 
  1745. a few ways supported, so if you learn them, you should be set), but that 
  1746. Apple doesn't document them in places where games writers look for them.
  1747.  
  1748. At least *I* wouldn't have thought to look in the writing Mac-card-driver 
  1749. docs for info on how to use page-flipping in a Mac video game...
  1750.  
  1751. The other problem is that since Apple doesn't let anyone know that they 
  1752. exist, everyone thinks that they don't and don't bother to track them down.
  1753.  
  1754.  
  1755. --
  1756. - -----------------------------------------------------------------------------
  1757. Lawson English                            __  __     ____  ___       ___ ____
  1758. english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  1759.                                         /   / \  / / / / /__ /  \/ /___  /
  1760. - -----------------------------------------------------------------------------
  1761.  
  1762. +++++++++++++++++++++++++++
  1763.  
  1764. >From jmunkki@beta.hut.fi (Juri Munkki)
  1765. Date: 30 Oct 1995 05:10:33 GMT
  1766. Organization: Helsinki University of Technology
  1767.  
  1768. In article <46u2ov$1a9@nnrp1.news.primenet.com> english@primenet.com (Lawson English) writes:
  1769. >I believe that the guy that did Tempest port (Arashi?) has some generic 
  1770. >code to do page-flipping on NuBus cards, since there is an API for 
  1771. >pageflipping on NuBus cards which apparently virtually no available card 
  1772. >uses.
  1773.  
  1774. Arashi does more than page flipping, but it uses palette animation to do it.
  1775. There are two background bitplanes (single buffered) and double buffered
  1776. 3 bit (8 color) buffer. For this reason, Arashi has take over the full
  1777. screen at 8 bits/pixel and still only provides 10 different colors (background,
  1778. bitplane 1&2, and double buffered 7 colors + transparent).
  1779.  
  1780. There are other disadvantages to using palette changes. The main problem
  1781. is that the timing depends on the video card driver: some wait for
  1782. vertical blanking and some do not.
  1783.  
  1784. The API you mentioned exists, but most cards just support one page anyway.
  1785. I think Oids is one of the few games that use it.
  1786.  
  1787. -- 
  1788. Juri Munkki jmunkki@iki.fi      There ain't no such thing as a shareware lunch.
  1789. http://www.iki.fi/~jmunkki              Windsurfing: Faster than the wind.
  1790.  
  1791. ---------------------------
  1792.  
  1793. End of C.S.M.P. Digest
  1794. **********************
  1795.